package com.season.seasonStudy.javase.j_019_xmlFile;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * root 跟
 * element元素  ，节点，  差不多
 * 里面的内容是节点，但不是元素
 * trim 去空格
 * 
 * classnotfound包找不到，重名，不存在，包版本升级
 * 
 */
/**
 * 用子节点element找出所有的，遍历
 * 用递归，得到了，放在集合之中
 * 
 * 用xml读取数据库，试一下，
 * 
 * selectNode()很好用能解决很多问题
 * 
 * Element是可以有属性和子节点的node。
 * 
 * xpath  语法 在w3c中xml中可以查到
 * 
 * 递归对反射用处也挺大的
 */
/**
 * getAttribute 得到第一个 不能跨标签 book可以找name shop 不能找name
 * 
 * element attribute 都是note的子类差不多的用法
 * 
 */
public class TestOfMine {
	public static void main(String[] args) {
		SAXReader reader = new SAXReader();
		//simple api for xml
			try {
				Document doc = reader.read(new File("src/learning/xmlFile/myxml.xml"));
//				reader读完了得到具体的document
				
				System.out.println(doc.getName());
				//得到路径加文件  file:///C:/Users/Jijie/MyJava/myMVC/src/myxml.xml
				
				Element rootNode = doc.getRootElement();
				//	root根节点/元素	从具体的xml文件中得到根节点的对象
				
				System.out.println(rootNode.getName());
				//root name 
				
				System.out.println("--"+rootNode.getData()+"----");
				System.out.println("--------------------");
				System.out.println(rootNode.getTextTrim());
				//这个可以去除空格

				System.out.println("rootnode.getNodeTypeName："+rootNode.getNodeTypeName());
				//返回节点类型 	element
				
				int rootNodeCount = rootNode.attributeCount();
				System.out.println("节点下元素个数"+rootNodeCount);
				//咳咳，知道了个数，遍历呗，几次自己都知道，没什么好犹豫的
				/**
				 * String element.getName()
				 * int element.attributeCount()
				 * String element.getTextTrim()得到自己下面的数据
				 * 
				 * Attribute element.attribute(int/String);
				 * 元素、节点在这里是分开的，写在一起是attribute，不在一起是node
				 * String attribute.getValue/getText
				 */
				rootNode.attribute(0);
				System.out.println(rootNode.attribute(0));
				System.out.println(rootNode.attribute("name"));
				//根据下标，从0开始（oracle从1开始）得到想要的数据，不过得到的是attribute				
				//或者使用字符串，精确定位	
				
				System.out.println("getValue "+rootNode.attribute("name").getValue());
				System.out.println("getText  "+rootNode.attribute("name").getText());
				/**
				 * 总结下就是：1、利用element、attribute获取下面的节点
				 * 2、是节点，就看元素，接着看下面是否还有节点，没有就算了
				 * 3、可以利用递归来进行循环遍历
				 * 4、遇到难题或者相似的，就去自己想办法解决它，不要放弃，亲爱的
				 * 
				 * 
				 */
				
				
				List<Element> list=rootNode.elements();
				//得到下面的book element集合
				System.out.println("length:"+list.size());
				for (int i = 0; i < list.size(); i++) {
					System.out.println(list.get(i).getTextTrim());//获得的是内部数据
					System.out.println(list.get(i).attributeValue("id"));//获得的是元素内容
					System.out.println(list.get(i).attribute("id").getText());
					//得到了想要的数据，但是报空指针异常
				}
				
				
				List<Node> listName=rootNode.selectNodes("book/name");
				//直接选择自己想要的节点，从开始的地方的子节点开始	
				System.out.println("length:"+listName.size());
				/**
				 * 同上面一样，list感觉写出来跟不写对学习没多大影响
				 */
				for (Node node : listName) {
					System.out.println(node.getText());
				}
				
				
				
				List<Node> listTest1=rootNode.selectNodes("book[@id!='2']/author");
				List<Node> listTest2=rootNode.selectNodes("descendant::name");
				for (Node node : listTest1) {
					System.out.println(((Element)node).getText());
				}
				for (Node node : listTest2) {
					System.out.println(((Element)node).getText());
				} 
				
			} catch (DocumentException e) {
				e.printStackTrace();
			}

	}
}
